package com.lzyyj.gmis.base.service;

import com.lzyyj.gmis.base.model.IUser;
import org.springframework.context.ApplicationContext;

import java.io.Serializable;
import java.util.List;
import java.util.Map;

public interface ISystemService {

    final static String SYSTEM_SERVICE = "SystemService";

    /**
     * 系统启动，运行环境初始化
     *
     * @param context 环境参数
     * @throws Exception 可能的异常
     */
    void contextInitialized(ApplicationContext context) throws Exception;

    /**
     * 系统停止，运行环境销毁
     *
     * @throws Exception 可能的异常
     */
    void contextDestroyed() throws Exception;

    /**
     * 获得线程线程变量Map
     *
     * @return 线程变量Map
     */
    Map<String, Object> getThreadLocalMap(boolean create);

    /**
     * 设置线程变量Map
     *
     * @param map 线程变量Map
     */
    void setThreadLocalMap(Map<String, Object> map);

    /**
     * 删除线程变量Map
     */
    void removeThreadLocalMap();

    /**
     * 获得菜单管理服务
     *
     * @return 菜单服务
     */
    IMenuService<? extends Serializable> getMenuService();

    /**
     * 设置菜单管理服务
     *
     * @param menuService 菜单服务
     */
    void setMenuService(IMenuService<? extends Serializable> menuService);

    IPurviewService<? extends Serializable> getPurviewService();

    void setPurviewService(IPurviewService<? extends Serializable> purviewService);

    IRoleService<? extends Serializable> getRoleService();

    void setRoleService(IRoleService<? extends Serializable> roleService);

    IOrganizationService<? extends Serializable> getOrganizationService();

    void setOrganizationService(IOrganizationService<? extends Serializable> organizationService);

    IDepartmentService<? extends Serializable> getDepartmentService();

    void setDepartmentService(IDepartmentService<? extends Serializable> departmentService);

    void sessionCreated(String sessionId, Map<String, Object> session);

    /**
     * 有用户登录成功
     *
     * @param user 登录用户
     */
    void logined(IUser<Serializable> user);

    /**
     * 有用户已注销
     *
     * @param user 注销用户
     */
    void logouted(IUser<Serializable> user);

    /**
     * 获取在线人数
     *
     * @return
     */
    int getOnLineCount();

    /**
     * 在Spring配置中查找指定的服务(不限于服务)
     *
     * @param clazz 服务类
     * @return 服务类列表
     * @throws Exception 可能的异常
     */
    <T> List<T> findService(Class<T> clazz);

    <T> Map<String, T> getServiceMap(Class<T> clazz);

}
